package edzest.basic;

import java.util.ArrayList;
import java.util.Iterator;

import edzest.model.SungJukVO;

public class J22_Collection {

	public static void main(String[] args) {
		// 컬렉션 프레임워크 다루기
		// ArrayList - 가변크기를 지원하는 배열
		
		// ArrayList 선언
		ArrayList sjdata = new ArrayList();
		// JDK1.5 이전 방식으로 코드 작성
		// ArrayList is a raw type. 
		// References to generic type ArrayList<E> 
		// should be parameterized
		
		// ArrayList에 데이터 추가 (add(내용))
		sjdata.add(123);
		sjdata.add('가');
		sjdata.add(987.65);
		sjdata.add("xyz");
		
		// CRUD 중 C
		// 특정위치에 데이터 추가 (add(위치, 내용))
		sjdata.add(2, new SungJukVO());
		// sjdata.add(10, new SungJukVO());
		// Exception in thread "main" 
		// java.lang.IndexOutOfBoundsException: 
		// Index: 10, Size: 5  
		// sjdata에 총  5개의 데이터가 저장중인데
		// 10번째 인덱스에 데이터 추가는 불가
		
		// CRUD 중 R
		// ArrayList상의 데이터 알아내기(get(위치))
		System.out.println( sjdata.get(0) );
		System.out.println( sjdata.get(2) );
		// 객체 출력 시 해당객체의 toString()메서드를 출력
		// 해당 객체의 toString()이 따로 정의되어있지않다면
		// 부모 클래스의 toString()이 호출되어 출력됨
		// Object의 toString()은 객체의 주소를 기본으로 출력
		
		// System.out.println( sjdata.get(9) );
		// 오류 outofbounds
		
		// ArrayList에 저장된 데이터 갯수 알아내기 (size())
		System.out.println( sjdata.size() );
		
		// CRUD 중 D
		// ArrayList에 저장된 데이터 제거(remove(위치))
		System.out.println( sjdata.get(3) );
		sjdata.remove(3);
		System.out.println( sjdata.get(3) );
		// 동적배열: 그냥 배열은 해당 위치 제거하면 그 자리가 비지만
		// 동적배열은 제거하면 빈자리에 뒤의 데이터가 동적으로 옮겨옴
		
		// CRUD 중 U
		// ArrayList에 저장된 데이터 수정(set(위치, 값))
		sjdata.set(3, "abc");
		System.out.println( sjdata.get(3) );
		
		// ArrayList의 데이터 존재유무 확인 (contains(값))
		// 데이터가 있으면 true 없으면 false
		System.out.println( sjdata.contains(123) );
		System.out.println( sjdata.contains('가') );
		System.out.println( sjdata.contains("xyz") );
		
		// ArrayList의 데이터 위치 찾기 (indexOf(값))
		// 데이터가 인덱스에 없으면 -1을 반환
		System.out.println( sjdata.indexOf(123) );
		System.out.println( sjdata.indexOf('가') );
		System.out.println( sjdata.indexOf("abc") );
		System.out.println( sjdata.indexOf("xyz") );
		
		// ArrayList의 데이터 모두제거 (clear())
		sjdata.clear();
		
		// ArrayList의 데이터 존재여부 (isEmpty())
		System.out.println( sjdata.isEmpty() );
		
		/*---------------------------------------*/
		sjdata.add("태희");sjdata.add("지현");
		sjdata.add("수지");sjdata.add("혜교");
		sjdata.add("지연");
		// ArrayList 상의 모든 데이터 출력(1)
		for(int i=0; i < sjdata.size(); ++i){
			System.out.println( sjdata.get(i) );
		}
		
		// ArrayList 상의 모든 데이터 출력(2)
		// Iterator 인터페이스를 이용하면
		// 편리하게 collection의 요소들을 처리할 수 있음
		// for문보다 사용도 간단하고 메모리도 절약
		// for문은 인덱스를 가리키는 변수를 사용(i)
		Iterator iter = sjdata.iterator();
		while( iter.hasNext() ){
			System.out.print( iter.next() );
		}
	}

}
